package com.wtx.fitness.controller;

import com.wtx.fitness.common.Result;
import com.wtx.fitness.common.ResultCode;
import com.wtx.fitness.entity.SportItem;
import com.wtx.fitness.exception.BusinessException;
import com.wtx.fitness.exception.NotFoundException;
import com.wtx.fitness.exception.UnauthorizedException;
import com.wtx.fitness.service.SportItemService;
import com.wtx.fitness.util.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 体测项目控制器
 */
@RestController
@RequestMapping("/api")
public class SportItemController {

  @Autowired
  private SportItemService sportItemService;

  /**
   * 获取所有体测项目
   */
  @GetMapping("/sport-items")
  public Result<List<SportItem>> getAllSportItems() {
    List<SportItem> sportItems = sportItemService.getAllSportItems();
    return Result.success(sportItems);
  }

  /**
   * 获取体测项目详情
   */
  @GetMapping("/sport-items/{id}")
  public Result<SportItem> getSportItemById(@PathVariable("id") Integer id) {
    SportItem sportItem = sportItemService.getSportItemById(id);
    if (sportItem == null) {
      throw new NotFoundException("体测项目不存在");
    }
    return Result.success(sportItem);
  }

  /**
   * 根据性别获取适用的体测项目
   */
  @GetMapping("/sport-items/gender/{gender}")
  public Result<List<SportItem>> getSportItemsByGender(@PathVariable("gender") String gender) {
    // 验证性别参数
    if (!"男".equals(gender) && !"女".equals(gender) && !"通用".equals(gender)) {
      throw new BusinessException(ResultCode.PARAM_ERROR, "性别参数无效，必须为'男'、'女'或'通用'");
    }

    List<SportItem> sportItems = sportItemService.getSportItemsByGender(gender);
    return Result.success(sportItems);
  }

  /**
   * 添加体测项目（管理员）
   */
  @PostMapping("/admin/sport-items")
  public Result<SportItem> addSportItem(@RequestBody SportItem sportItem) {
    // 验证是否为管理员
    String userType = TokenUtil.getUserType();

    if (userType == null) {
      throw new UnauthorizedException("请先登录");
    }

    if (!"admin".equals(userType)) {
      throw new UnauthorizedException("无权限进行此操作");
    }

    // 验证参数
    if (sportItem.getItemName() == null || sportItem.getItemName().trim().isEmpty()) {
      throw new BusinessException(ResultCode.PARAM_ERROR, "项目名称不能为空");
    }

    if (sportItem.getGenderScope() == null || sportItem.getGenderScope().trim().isEmpty() ||
        (!"男".equals(sportItem.getGenderScope()) && !"女".equals(sportItem.getGenderScope())
            && !"通用".equals(sportItem.getGenderScope()))) {
      throw new BusinessException(ResultCode.PARAM_ERROR, "适用性别必须为'男'、'女'或'通用'");
    }

    // 添加体测项目
    int result = sportItemService.addSportItem(sportItem);
    if (result <= 0) {
      throw new BusinessException(ResultCode.SYSTEM_ERROR, "添加体测项目失败");
    }

    return Result.success(sportItem);
  }

  /**
   * 更新体测项目（管理员）
   */
  @PutMapping("/admin/sport-items/{id}")
  public Result<Void> updateSportItem(@PathVariable("id") Integer id, @RequestBody SportItem sportItem) {
    // 验证是否为管理员
    String userType = TokenUtil.getUserType();

    if (userType == null) {
      throw new UnauthorizedException("请先登录");
    }

    if (!"admin".equals(userType)) {
      throw new UnauthorizedException("无权限进行此操作");
    }

    // 验证项目是否存在
    SportItem existingItem = sportItemService.getSportItemById(id);
    if (existingItem == null) {
      throw new NotFoundException("体测项目不存在");
    }

    // 验证参数
    if (sportItem.getItemName() == null || sportItem.getItemName().trim().isEmpty()) {
      throw new BusinessException(ResultCode.PARAM_ERROR, "项目名称不能为空");
    }

    if (sportItem.getGenderScope() == null || sportItem.getGenderScope().trim().isEmpty() ||
        (!"男".equals(sportItem.getGenderScope()) && !"女".equals(sportItem.getGenderScope())
            && !"通用".equals(sportItem.getGenderScope()))) {
      throw new BusinessException(ResultCode.PARAM_ERROR, "适用性别必须为'男'、'女'或'通用'");
    }

    // 设置ID
    sportItem.setId(id);

    // 更新体测项目
    int result = sportItemService.updateSportItem(sportItem);
    if (result <= 0) {
      throw new BusinessException(ResultCode.SYSTEM_ERROR, "更新体测项目失败");
    }

    return Result.success();
  }

  /**
   * 删除体测项目（管理员）
   */
  @DeleteMapping("/admin/sport-items/{id}")
  public Result<Void> deleteSportItem(@PathVariable("id") Integer id) {
    // 验证是否为管理员
    String userType = TokenUtil.getUserType();

    if (userType == null) {
      throw new UnauthorizedException("请先登录");
    }

    if (!"admin".equals(userType)) {
      throw new UnauthorizedException("无权限进行此操作");
    }

    // 验证项目是否存在
    SportItem existingItem = sportItemService.getSportItemById(id);
    if (existingItem == null) {
      throw new NotFoundException("体测项目不存在");
    }

    // 删除体测项目
    int result = sportItemService.deleteSportItem(id);
    if (result <= 0) {
      throw new BusinessException(ResultCode.SYSTEM_ERROR, "删除体测项目失败");
    }

    return Result.success();
  }
}